Every pull request gets its own production.
Build · Share · Deploy
From pull request to production, without the queue.
Canary builds a full-stack copy of your app for each branch, shares it by link, and tears it down the moment you merge.
GitHub and GitLab · Compose or Helm · Runs in your cloud
Real environments for every branch
- Overview
- Deployments
- Logs
- Metrics
- Settings
Overview
- Branch
- feat/multi-currency
- Deployed
- 2 minutes ago
- Commit
- a41f9c2
- URL
- https://staging.northwind.app
Pull requests
3-
#482 Split invoices by currency
2s ago
-
#481 Improve search ranking
1h ago
-
#480 Add customer filters
2h ago
- Overview
- Deployments
- Logs
- Metrics
- Settings
- 09:12:04 clone feat/multi-currency @ 9f3e1b0 2s
- 09:12:06 build web, api, worker from docker-compose.yml 1m 12s
- 09:13:18 postgres@16 restored from nightly snapshot 48s
- 09:14:06 mask users.email, users.name, cards.number 9s
- 09:14:20 deploy to ephemeral environment 14s
- 09:14:34 health checks passing 3s
-
Automatic previews
For every pull request
-
Realistic environments
With your full stack
-
Share by link
With anyone
-
Tears down automatically
When you merge
Where 1,140 engineering teams review their pull requests
- Oxbow
- Tessel
- Halyard
- Brightline
- Kilnworks
- Marlow
Last 30 days
Staging stopped being a queue.
Measured across every Canary workspace, from the first push on a branch to the last container removed.
- Median time from push to a live link
- 3m 41s
- Preview environments created
- 11,806
- Median teardown after merge
- 2m 12s
- Average cost of a preview-hour
- $0.19
Open a pull request. Canary does the rest.
No staging calendar, no thread asking who broke it. Canary listens for three events and handles each one.
-
pull_request.opened
Builds the whole stack
Your Compose file becomes web, API and worker, next to a Postgres seeded from last night's masked snapshot.
-
push
Redeploys in place
Each commit rebuilds only the services that changed, and the link stays the same.
-
pull_request.merged
Tears it all down
Containers, volumes and DNS are gone within minutes, so nothing idles on your bill.
canary bot commented 4 minutes ago
Preview ready for 9f3e1b0
| Service | Status | Build |
|---|---|---|
| web | Ready | 1m 12s |
| api | Ready | 58s |
| worker | Ready | 41s |
| postgres | Seeded | 1m 30s |
Open preview
Torn down automatically when #482 merges.
Everything staging should have been.
Each preview is a real environment with real-shaped data, its own secrets, and an end date.
Production-shaped data, minus the people
Seeded from a nightly snapshot, with names, emails and card numbers masked before they leave your cloud.
| Table | Rows | Rule |
|---|---|---|
| users | 48,210 | masked |
| orders | 312,904 | copied |
| invoices | 91,337 | copied |
| payments | 12,480 | tokenized |
| audit_events | — | skipped |
Opened by 5 people today
One link for the whole review
Design, QA and the customer who asked for it all open the same URL.
- Opened09:12
- Live09:16
- Merged14:03
- Torn down14:05
Gone the minute it merges
Nothing to remember to delete.
- STRIPE_KEY sk_test_••••4f2a
- DATABASE_URL postgres://pr-482.db.internal:5432/northwind
- MAIL_DRIVER log
Secrets scoped to the branch
Test keys by default. Production credentials never reach a preview.
$38.20 of $150 this month
A ceiling on spend
Idle previews sleep after 30 minutes, and the workspace stops at the cap you set.
One file, checked in next to your code.
canary.yml describes the stack once. Every branch reads its own copy, so previews change in review like everything else.
- Compose or Helm
- Point Canary at the file you already run locally. No second definition of your stack.
- Reviewed like code
- Change the preview in a pull request and that branch previews the change first.
- Runs in your cloud
- A runner in your AWS or GCP account builds and hosts every preview. Data never leaves it.
- # canary.yml — read on every push
- preview:
- from: docker-compose.yml
- services: [web, api, worker]
- database:
- engine: postgres@16
- seed: snapshot://nightly
- mask: [users.email, users.name, cards.number]
- secrets: test
- sleep_after: 30m
- teardown: on_merge
- budget:
- monthly_usd: 150
What changes when every branch has a link
-
We had one staging box and a channel just for booking it. Six weeks after Canary the channel is archived, and our median review is a day shorter.
Maren Okafor
Engineering Lead, Halyard
-
Designers review the real thing now, with real-shaped data, before anything merges. Nobody screenshots localhost anymore.
Jordan Ellis
Staff Engineer, Tessel
-
We set the cap at $400 a month and haven't come close. Previews sleep when nobody is looking at them.
Sam Rivera
Head of Platform, Oxbow
Priced per preview-hour, not per seat.
Invite the whole company to review. Previews sleep when idle, and you only pay while one is awake.
Compare every plan-
Hobby
$0 up to 3 previews at once
For side projects and trying it on a real repo.
- 500 preview-hours a month
- Seeded Postgres and Redis
- Public GitHub and GitLab repos
-
Team
Most teams$0.19 per preview-hour
Unlimited reviewers. You pay for the minutes a preview is awake.
- Unlimited concurrent previews
- Masked production snapshots
- Spend caps, SSO and audit log
Running more than 200 previews a day? Ask about volume pricing and a dedicated runner. Talk to sales
Give the next pull request a link.
Connect a repository and Canary builds your first preview while you watch the log. The first 500 preview-hours are free.